/**
 * 湖南江河机电自动化设备股份有限公司 版权所有
 * Copyright @2016-2020 All Rights Reserved
 */
package com.hnjme.cnec.mdm.service.impl;

import com.github.pagehelper.PageHelper;
import com.hnjme.cnec.common.DateUtils;
import com.hnjme.cnec.common.constant.ConstantsCode;
import com.hnjme.cnec.common.constant.JmeBizStatus;
import com.hnjme.cnec.common.exception.JmeException;
import com.hnjme.cnec.mdm.mapper.OrganizationMapper;
import com.hnjme.cnec.mdm.mapper.StaffMapper;
import com.hnjme.cnec.mdm.model.Organization;
import com.hnjme.cnec.mdm.model.Staff;
import com.hnjme.cnec.mdm.service.MasterDataService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;

import java.text.ParseException;
import java.util.List;

/**
 * @author outta
 * @Since 1.0 2018/8/29
 */
@Slf4j
@Service
public class MasterDataServiceImpl implements MasterDataService {
	@Autowired
	private StaffMapper staffMapper;

	@Autowired
	private OrganizationMapper organizationMapper;

	private Long parseSecond(String date) {

		if(StringUtils.isEmpty(date)){
			return null;
		}

		Long seconds = null;
		try {
			seconds = DateUtils.secondsOfDate(DateUtils.parseDate(date, DateUtils.DEFAULT_DATETIME_FORMAT));
		} catch (ParseException e) {
			log.warn("==>t 错误的时间格式！", e);
		}
		return seconds;
	}

	/**
	 * 查询组织机构信息列表
	 *
	 * @return
	 */
	@Override
	public List<Organization> queryOrganizations() {
		log.debug("==> \t查询全部的组织机构信息");
		return organizationMapper.queryOrganizations();
	}

	/**
	 * 查询全部的公司信息列表
	 *
	 * @param orgType    组织机构类型： 01= 行政组织机构；02=财物组织机构
	 * @param updateTime 查询开始时间
	 * @param page       当前页数
	 * @param limit      每页大小，limit>0采用分页；limit = 0或者为空表示不分页
	 * @return
	 */
	@Override
	public List<Organization> queryUnits(String orgType, String updateTime, Integer page, Integer limit) {
		log.debug("==> \t查询全部的公司信息列表");
		if (null != limit && limit > 0) {
			PageHelper.startPage(page, limit);
		}
		return organizationMapper.queryUnits(orgType, parseSecond(updateTime));
	}

	/**
	 * 查询机构代码为<code>unitCode</code>的公司的部门列表
	 *
	 * @param unitCode   公司机构代码
	 * @param orgType    机构类型
	 * @param updateTime 查询开始时间
	 * @param page       当前页数
	 * @param limit      每页大小
	 * @return
	 */
	@Override
	public List<Organization> queryDepartments(String unitCode, String orgType, String updateTime, Integer page, Integer limit) {
		log.debug("==> \t查询公司的部门列表，传入公司机构代码为：{},机构类型为：{}", unitCode, orgType);
		try {
			Assert.notNull(unitCode, "请输入要查询的机构的机构代码");
		} catch (IllegalArgumentException e) {
			log.warn("非法的查询参数");
			throw new JmeException(JmeBizStatus.METHOD_PARAMETER_IS_NULL, "请输入要查询的机构的机构代码");
		}
		if (null != limit && limit > 0) {
			PageHelper.startPage(page, limit);
		}

		return organizationMapper.queryDepartments(unitCode, orgType, parseSecond(updateTime));
	}

	/**
	 * 查询组织机构的基本信息
	 *
	 * @param code 机构代码
	 * @return 机构的基本信息
	 */
	@Override
	public Organization findOrganization(String code) {
		log.debug("==> \t查询组织机构的基本信息,机构代码：{}", code);
		try {
			Assert.notNull(code, "请输入要查询的机构的机构代码");
		} catch (IllegalArgumentException e) {
			log.warn("非法的查询参数", code);
			throw new JmeException(JmeBizStatus.METHOD_PARAMETER_IS_NULL, "请输入要查询的机构的机构代码");
		}

		Organization organization = organizationMapper.find(code);
		if (null == organization) {
			log.warn("没找到机构代码为[{}]的机构记录", code);
			throw new JmeException(JmeBizStatus.RECORD_NOT_FOUND, "没找到机构代码为[" + code + "]的机构记录");
		}
		return organization;
	}


	/**
	 * 查询员工代码为<code>code</code>的员工基本信息
	 *
	 * @param code 员工代码
	 * @return 员工信息
	 */
	@Override
	public Staff findStaff(String code) {
		log.debug("==> \t查询员工的基本信息,员工代码：{}", code);
		try {
			Assert.notNull(code, "请输入要查询的员工代码");
		} catch (IllegalArgumentException e) {
			log.warn("非法的查询参数", code);
			throw new JmeException(JmeBizStatus.METHOD_PARAMETER_IS_NULL, "请输入要查询的员工代码");
		}

		Staff staff = staffMapper.find(code);
		if (null == staff) {
			log.warn("没找到员工代码为[{}]的记录", code);
			throw new JmeException(JmeBizStatus.RECORD_NOT_FOUND, "没找到员工代码为[" + code + "]的记录");
		}
		return staff;
	}

	/**
	 * 查询全部的员工信息
	 *
	 * @return 员工列表
	 */
	@Override
	public List<Staff> queryStaffs() {
		log.debug("==> \t查询全部的组织机构信息");
		return staffMapper.queryStaffs(null, null, null);
	}

	/**
	 * 查询公司的员工列表
	 *
	 * @param unitCode 公司代码
	 * @param page     当前页
	 * @param limit    每页大小
	 * @return 员工列表
	 */
	@Override
	public List<Staff> queryStaffs(String unitCode, String updateTime, Integer page, Integer limit) {
		log.debug("==> \t查询公司的员工列表，传入公司机构代码为：{}", unitCode);
		try {
			Assert.notNull(unitCode, "请输入要查询的机构的机构代码");
		} catch (IllegalArgumentException e) {
			log.warn("非法的查询参数");
			throw new JmeException(JmeBizStatus.METHOD_PARAMETER_IS_NULL, "请输入要查询的机构的机构代码");
		}
		if (null != limit && limit > 0) {
			PageHelper.startPage(page, limit);
		}
		return staffMapper.queryStaffs(unitCode, null, parseSecond(updateTime));
	}

	/**
	 * 查询公司部门的员工列表
	 *
	 * @param unitCode 公司代码
	 * @param deptCode 部门代码
	 * @param page     当前页数
	 * @param limit    每页大小
	 * @return 员工列表
	 */
	@Override
	public List<Staff> queryStaffs(String unitCode, String deptCode, String updateTime, Integer page, Integer limit) {
		log.debug("==> \t查询公司的员工列表，传入公司机构代码为：{}", unitCode);
		try {
			Assert.notNull(unitCode, "请输入要查询的机构的机构代码");
			Assert.notNull(deptCode, "请输入要查询的部门代码");
		} catch (IllegalArgumentException e) {
			log.warn("非法的查询参数");
			throw new JmeException(JmeBizStatus.METHOD_PARAMETER_IS_NULL, "请输入要查询的机构代码");
		}
		if (null != limit && limit > 0) {
			PageHelper.startPage(page, limit);
		}
		return staffMapper.queryStaffs(unitCode, deptCode, parseSecond(updateTime));
	}

	/**
	 * 处理组织机构信息
	 *
	 * @param data     组织机构信息
	 * @param operType 操作类型
	 * @return true: 处理成功；false：处理失败
	 */
	@Override
	@Transactional(rollbackFor = Exception.class)
	public boolean processOrganization(Organization data, String operType) {
		log.debug("==> \t开始处理组织机构信息！操作类型：{}", operType);
		try {
			if (ConstantsCode.OPERTYPE_ADD.equalsIgnoreCase(operType)) {
				organizationMapper.add(data);
			}
			if (ConstantsCode.OPERTYPE_STOP.equalsIgnoreCase(operType)) {
				organizationMapper.enabledOrganization(false, data.getCode());
			}
			if (ConstantsCode.OPERTYPE_ENABLE.equalsIgnoreCase(operType)) {
				organizationMapper.enabledOrganization(true, data.getCode());
			}
			if (ConstantsCode.OPERTYPE_UPDATE.equalsIgnoreCase(operType)) {
				organizationMapper.update(data);
			}
			return true;
		} catch (Exception e) {
			log.warn("==> \t处理组织机构信息失败", e);
			return false;
		}
	}

	/**
	 * 处理接口上获得的员工信息
	 *
	 * @param data     员工信息
	 * @param operType 操作类型
	 * @return true 处理成功；false：处理失败
	 */
	@Override
	@Transactional(rollbackFor = Exception.class)
	public boolean processStaff(Staff data, String operType) {
		log.debug("==> \t开始处理员工信息！操作类型：{}", operType);
		try {
			if (ConstantsCode.OPERTYPE_ADD.equalsIgnoreCase(operType)) {
				staffMapper.add(data);
			}
			if (ConstantsCode.OPERTYPE_STOP.equalsIgnoreCase(operType)) {
				staffMapper.enabledStaff(false, data.getCode());
			}
			if (ConstantsCode.OPERTYPE_ENABLE.equalsIgnoreCase(operType)) {
				staffMapper.enabledStaff(true, data.getCode());
			}
			if (ConstantsCode.OPERTYPE_UPDATE.equalsIgnoreCase(operType)) {
				staffMapper.update(data);
			}
			return true;
		} catch (Exception e) {
			log.warn("==> \t处理员工信息失败", e);
			return false;
		}
	}
}
